iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
自我挑戰組

SPYxFRONTEND ~ 懂一點後端真是讓人哇哭哇哭系列 第 12

[Day12] 用 axios.post 可以任意新增資料? 先過 middlewares 這關吧!

  • 分享至 

  • xImage
  •  

前言

昨天在文章的最後有稍微劇透一下 axios.post
但沒詳細說明丟的資料格式之類的,
那麼今天就來認真看一下吧!

(開始前請記得在 local 端開好前端、後段:
後端:json-server --watch db.json --port 10000
前端:npm start)

本日正文

axios.post 新增資料

昨天試了 axios.post,這個會新增資料,
那你可能會問說,你怎麼知道這個是拿來新增呢?

你從 Axios官方文件
只會看到簡單的說明:

// Send a POST request
axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});
Request method aliases
For convenience aliases have been provided for all supported request methods.

axios.get(url[, config])
axios.delete(url[, config])
axios.post(url[, data[, config]])
axios.patch(url[, data[, config]])

也只提到如何傳送一個 POST 要求,
看來這個動詞可能是 common sense,
所以官網也沒有多做說明XD
POST 的涵義就要從資料的 CRUD 談起。

CRUD:資料的增刪查改

CRUD,由 Crete, Read, Update, Delete 的縮寫而來,
分別代表增加、讀取、更新、刪除的意思。

而在不同領域中, CRUD 又有不同實作的 function,
如維基百科提到:
https://ithelp.ithome.com.tw/upload/images/20220913/20129873ohQwn5gIzj.png

在 HTTP 中,新增是 PUT / POST、讀取是 GET...(以此類推)
所以 POST 語意上是新增的意思。(很多套件應該也是這樣使用)

解決第一個問題,
再來你可能會問說,那你怎麼知道 axios.post 要帶什麼參數進去呢?

當然一樣來看官方文件囉,
官方的例子是這樣的:

axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })

對應到前面有貼的這行:

axios.post(url[, data[, config]])

所以 axios.post 第一個參數是你要 call 的 API url,
第二個參數丟資料,
資料的格式就是丟 json 格式的 Object,
(我在前幾天的文章也有稍微提到 axios 可以丟的格式)
那現在我們就來試試看,
如果把資料改成範例的這個是否會新增成功吧!
像這樣:

... (略)
function addData(){
    axios.post('http://localhost:10000/posts/', {
      firstName: 'Fred',
      lastName: 'Flintstone'
    })
    .then(res => {
      console.log(res.data);
    });
    fetchData();
  }
... (略)

https://ithelp.ithome.com.tw/upload/images/20220913/2012987399O6fpESwW.png

在新增資料後,
你在畫面上已經可以看到第5筆資料出現了,
http://localhost:10000/posts 也看得到被新增的第5筆資料,
https://ithelp.ithome.com.tw/upload/images/20220913/20129873OTiTIETHpE.png

也就是說,
前端無論丟怎樣的格式過去,API 就照單全收嗎?
這樣不是很容易有髒資料出現?

middlewares:想傳送要求先過我這關

https://ithelp.ithome.com.tw/upload/images/20220914/20129873xNiLp7xU16.png
硬是要放一下先過我這關的示意圖但是不是曝露自己年紀惹
其實實務上 API 通常會訂好 schema (json 格式也一樣),
就跟我們之前常見的資料庫,
我們可能會先訂好裡面有 姓名身高體重... 的欄位,
有丟這些欄位的 SQL 語法才能真的被下成功。

那麼 JSON server 也可以讓我們去限制資料內容,
有丟 titlearticle 才是合法資料,
才能允許它新增嗎?

可以的!
JSON server 有提供 middlewares 的方式讓你做簡單的判斷。

首先我們先新增一個 limit.js 的檔案,
裡面我們先簡單寫一下限制:

module.exports = function(req, res, next) {
    if (req.method === 'GET') {
      next();
    }
    if (req.method === 'POST') {
      if (JSON.stringify(req.body).includes('title') && JSON.stringify(req.body).includes('author')) {
        next();
      }
    }
  };

解釋一下,第一個 if 就是去判斷,如果要求的方法是 'GET' 就繼續做 next()
再來就是今日的重頭戲!
第二個 if 就是如果要求的方法是 'POST',
我們就要判斷發出要求的內容 req.body 有沒有包含 titleauthor 的字眼,
有的話才繼續做。

這邊定義好以後,
當然指令記得要去指定這個 middlewares 才會生效哦!

指令如下:

json-server --watch db.json --port 10000 --middlewares limit.js

https://ithelp.ithome.com.tw/upload/images/20220913/201298731uTB9zt4ze.png

後端的 json-server 重新起好後,
我們再執行一次前端送 axios.post 的要求:
(這次資料是那個含有 firstName 的範例資料)

function addData(){
    axios.post('http://localhost:10000/posts/', {
      firstName: 'Fred',
      lastName: 'Flintstone'
    })
    .then(res => {
      console.log(res.data);
    });
    fetchData();
  }


這次第6筆資料無法成功新增了,
那如果我們再把資料改成含有 titleauthor 試試看:

function addData(){
    axios.post('http://localhost:10000/posts/', {
      id: 6,
      title: '我是第6篇文章',
      author: 'Misado'
    })
    .then(res => {
      console.log(res.data);
    });
    fetchData();
  }

第6篇資料有新增成功,
表示我們寫在 middlewares (limit.js) 是有成功起到作用的!

我今天寫的方式算是滿粗糙的,
真的後端應該會寫得更精細,就是會先訂好 schema 後再去檢查之類的,
而且被丟了一個不合法的 input,應該還要回傳 error code 給前端......
越講越多惹orz
但畢竟我不是專業的後端XD 再寫下去我就會變後端了

不過這邊就是讓前端小小體驗一下,
API 其實也會做傳送資料的卡關,並不是任由你傳 API 就乖乖做這樣~
(所以如果 call API 有問題,其中一項就是要檢查你丟的資料格式有沒有問題)

JSON Server 雖然算是小型陽春的 API Server,
不過其實支援滿多額外功能,
像是今天介紹的 middlewares
還有之後打算要介紹的 routes ...等等,
真是麻雀雖小五臟俱全!

那麼接下來的文章會繼續介紹 axios 的 CRUD,
再一邊介紹 JSON Server 其它好用的功能。
那我們明天見啦~~~~

參考文章

JSON Server
Axios API
打造多檔案結構的json-server → 這篇幫我很多,感謝大大對 middlewares 的說明m(_ _)m
JavaScript基本功修練:Day29 - axios基本語法與練習(GET、POST請求)

後記

其實今天文章本來只打算講完 axios.post
但真的覺得有點少,
因此加碼了 middlewares
差點天窗orz
還好來得及QQ
繼續努力加餐飯QQ

然後剛剛才發現今天 0913程式設計師節!!!!!!!!!!!!!
https://ithelp.ithome.com.tw/upload/images/20220913/20129873d3eg1RWfxe.jpg

祝大家 程式設計師節大快樂 ☆,::‧( ̄▽ ̄)/‧:‧°☆*


上一篇
[Day11] 前端也可以自己開 API!讓你了解後端的好幫手~ JSON Server
下一篇
[Day13] 用 axios.patch 來修改資料
系列文
SPYxFRONTEND ~ 懂一點後端真是讓人哇哭哇哭30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言